Technical Q&A QA1222
Using Clip Region and Buffer Rectangles with OpenGL Carbon


Q: AGL ÇÃÉoÉbÉtÉ@ãÈå`ÇΔÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇÕÇ«ÇÃÇÊǧDžégópÇ∑ÇÈÇÃÇ≈Ç∑Ç©ÅH

A: AGL ÉoÉbÉtÉ@ãÈå`ÇÃégópï˚ñ@ÇΔÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇÃégópï˚ñ@ÇÕÅAëÂïœÇÊÇ≠éóǃǢNjÇ∑ÅBaglSetInteger ÇégópǵǃãÈå`Ç‹ÇΩÇÕÉäÅ[ÉWÉáÉìÇÉZÉbÉgÉAÉbÉvǵÅAéüÇ…ÅAaglEnable Ç‹ÇΩÇÕ aglDisable ÇégópǵǃÅAÉoÉbÉtÉ@ãÈå`ÇΔÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇÃóºé“ÇÃã@î\ÇóLå¯Ç‹ÇΩÇÕñ≥å¯Ç…ǵNjÇ∑ÅBÉNÉâÉCÉAÉìÉgÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAãÈå`ÇΔÉäÅ[ÉWÉáÉìÇÃÉfÅ[É^ÇÃóLå¯âªÇΔê›íËÇÕÅAÉRÉìÉeÉLÉXÉgÇ≤ÇΔÇ…é¿çsÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBǻǮÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕí èÌÇà OpenGL ÉNÉâÉCÉAÉìÉgÉRÅ[ÉhÇ≈Ç∑Ç™ÅADZDZDžé¶Ç∑éËñ@ÇÕÅAÉhÉçÉAÉuÉãÇΔä÷òAÉRÉìÉeÉLÉXÉgÇéùǬǟǩÇà Carbon OpenGL ÉNÉâÉCÉAÉìÉgÇ≈LJégópÇ≈Ç´Ç‹Ç∑ÅB

ì¡íËÇÃÉRÉìÉeÉLÉXÉgÇ≈ÉoÉbÉtÉ@ãÈå`ÇégópÇ∑ÇÈÇ…ÇÕÅAÉoÉbÉtÉ@ãÈå`ÇóLå¯Ç…Ç∑ÇÈÇΔÇΔLJDžÅAÉTÉCÉYLJê›íËÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBÉäÉXÉg 1 Ç…ó·Çé¶ÇµÇ‹Ç∑ÅB


#include <AGL/agl.h>

// aglContext ÇÕÅAä˘ë∂ÇÃóLå¯Ç»ÉRÉìÉeÉLÉXÉgÇ≈Ç»ÇØÇÍnjǻÇÁǻǢ
short left = 10, bottom = 10, width = 300, height = 300;
GLint bufferRect[4];

bufferRect[0] = left; // ç∂ï”ÇÕ 0
bufferRect[1] = bottom; // â∫ï”ÇÕ 0
bufferRect[2] = width; // ÉoÉbÉtÉ@ãÈå`ÇÃïù
bufferRect[3] = height; // ÉoÉbÉtÉ@ãÈå`ÇÃçÇÇ≥
aglSetInteger (aglContext, AGL_BUFFER_RECT, bufferRect);
aglEnable (aglContext, AGL_BUFFER_RECT);

ÉäÉXÉg 1. ÉoÉbÉtÉ@ãÈå`ÇÃÉZÉbÉgÉAÉbÉv


ÉoÉbÉtÉ@ãÈå`Ç™ÉEÉCÉìÉhÉEÉTÉCÉYÇ…ëŒâûǵǃǢÇÈèÍçáÅAÉEÉCÉìÉhÉEÉTÉCÉYÇ™ïœÇÌÇÈÇΩÇ—Ç…ÅAãÈå`ÇÅAí èÌÇÕ glViewport ÇΔÇΔLJDžçƒê›íËÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÉäÉZÉbÉgÇÕÅAkEventWindowShownÅAkEventWindowBoundsChangedÅAkEventWindowZoomed Ç®ÇÊÇ— kEventWindowResizeCompleted ǻǫÇà Carbon ÉEÉCÉìÉhÉEÉCÉxÉìÉgÇ…âûÇ∂ǃçsǧÇÊǧDžÇ∑ÇÈÇΔÇÊÇ¢Ç≈ǵÇÂǧÅBÇ≥ÇÁÇ…ÅAÉEÉCÉìÉhÉEÇÃì‡óeÇ™ïKÇ∏ç≈êVÇÃèÛë‘Ç…Ç»ÇÈÇÊǧDžÅAí èÌÅAkEventWindowActivatedÅAkEventWindowDrawContentÅAÇ®ÇÊÇ— kEventWindowBoundsChanged ǻǫÇà Carbon ÉEÉCÉìÉhÉEÉCÉxÉìÉgÇ™î≠ê∂ǵÇΩÇÁì‡óeÇï`âÊÇ∑ÇÈÇ◊Ç´Ç≈Ç∑ÅB

AGL Ç≈ÇÃÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇÃégópÇÕÅAÉoÉbÉtÉ@ãÈå`ÇÃégópÇΔëÂïœÇÊÇ≠éóǃǢNjÇ∑ÅBãÔëÃìIDžǢǶnjÅAÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇÕÅAÉoÉbÉtÉ@ãÈå`ÇΔÉAÉbÉvÉfÅ[ÉgóvåèÇ™ìØÇ∂Ç≈Ç∑ÅBÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇê›íËÇ∑ÇÈÇ…ÇÕÅA OpenGL Ç…ÇÊÇÈçXêVÇ OpenGL Ç™ï`âÊÇ∑ÇÈÇ◊Ç´ÉEÉCÉìÉhÉEïîï™ÇæÇØÇä‹ÇfiÉäÅ[ÉWÉáÉìÇ…å¿íËÇ∑ÇÈ QuickDraw ÉäÅ[ÉWÉáÉìÇçÏê¨ÇµÇ‹Ç∑ÅBÉäÉXÉg 2 Ç…é¶Ç∑ÉRÅ[ÉhÇÕDZÇÃàÍó·Ç≈Ç∑ÅBDZÇÃÉRÅ[ÉhÇ≈ÇÕÅAdžÇÈÉâÉìÉ_ÉÄÇ»ê}å`Çópà”ǵÅA4 ǬÇÃä˘ë∂ÇÃÉRÉìÉgÉçÅ[ÉãÇÃã´äEãÈå`ÇèúäOǵǃÅAÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇçÏê¨ÇµÇƒÇ¢Ç‹Ç∑ÅB


#include <AGL/agl.h>
#include <Carbon/Carbon.h>


 static void SetClipRegion (WindowRef win)
{
    RgnHandle       clipRgn = NewRgn();
    RgnHandle       maskRgn = NewRgn();
    Rectangle       rectPort, bounds = { -32767, -32767, 32767, 32767 };
    ControlID       idControl;
    ControlRef      control;

    GetWindowPortBounds(win, &rectPort);
    // âΩÇÁÇ©ÇÃÉâÉìÉ_ÉÄÉäÅ[ÉWÉáÉìÇÉZÉbÉgÉAÉbÉvÇ∑ÇÈ
    SetEmptyRgn (clipRgn);
    OpenRgn ();
    MoveTo (rectPort.left + 10, rectPort.top + 30);
    LineTo (rectPort.right - 20, rectPort.top + 50);
    LineTo (rectPort.right - 50, rectPort.bottom - 25);
    LineTo (rectPort.left + 10, rectPort.top + 50);
    CloseRgn (clipRgn);
    // ä˘ë∂ÇÃÉRÉìÉgÉçÅ[ÉãÇÃïîï™ÇêÿÇËî≤Ç≠ÅiÉEÉCÉìÉhÉEì‡Ç… 4 ǬdžÇÈLJÇÃÇΔÇ∑ÇÈÅj
    idControl.signature = 'cbrt'; // ÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅAnib Ç≈égópÇ≥ÇÍÇÈ
                                  // îCà”ÇÃÉVÉOÉlÉ`ÉÉÇégópÇ≈Ç´ÇÈ
    for (idControl.id = 0; idControl.id < 4; idControl.id++) {
        GetControlByID (win, &idControl, &control);
        GetControlBounds (control, &bounds);
        RectRgn(maskRgn, &bounds);
        DiffRgn(clipRgn, maskRgn, clipRgn);
    }
    // AGL ópÇ…ÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇê›íËÇ∑ÇÈ
    // aglContext ÇÕÅADZÇÃÉEÉCÉìÉhÉEópDždžÇÁÇ©
    // Ç∂Çflópà”Ç≥ÇÍǃǢÇÈóLå¯Ç»ÉRÉìÉeÉLÉXÉg

    aglSetInteger (aglContext, AGL_CLIP_REGION, (const GLint *)clipRgn);
    DisposeRgn(clipRgn);
    DisposeRgn(maskRgn);
}

ÉäÉXÉg 2. ÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇÃÉZÉbÉgÉAÉbÉv


èdóvÇ»ÇÃÇÕÅAaglSetInteger Çí Ç∂ǃ AGL Ç…ìnÇ∑ÉäÅ[ÉWÉáÉìÇÕéËìÆÇ≈çÏê¨ÇµÇΩLJÇÃÇ≈džÇËÅAÉEÉCÉìÉhÉEÇÃÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇ‹ÇΩÇÕâ¬éãÉäÅ[ÉWÉáÉìÇ…ÇÕä÷òAïtÇØÇÁÇÍǻǢÅAÇΔóùâǵǃǮÇ≠DZÇΔÇ≈Ç∑ÅBÉEÉCÉìÉhÉEÇÃÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇ AGL Ç…ìnÇ∑DZÇΔÇÕÇ≈Ç´Ç‹Ç∑Ç™ÅAÉNÉäÉbÉvóÃàÊÇ…ïœçXǙdžÇÈÇΩÇ—Ç…ÅAAGL ÇÃÉäÅ[ÉWÉáÉìÇÃÉRÉsÅ[LJéËìÆÇ≈çXêVÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBǬNjÇËÅAAGL Framework Ç…ÇÕÅAÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇé©ìÆìIÇ…îΩâfÇ∑ÇÈÉlÉCÉeÉBÉuÇ»ã@î\ÇÕǻǢÇΔǢǧDZÇΔÇ≈Ç∑ÅBDZÇÃÇÊǧǻédólDžǻǡÇΩÇÃÇÕÅAQuickDraw 2D Ç™ï`âÊǵǻǢâ”èäÇ… OpenGL Ç™ï`âÊÇ∑ÇÈâ¬î\ê´Ç™çÇÇ≠ÅAï`âÊÇÃëŒè€ÇΔÇ»ÇÈ QuickDraw ÇÃÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇ™ÅAOpenGL ÇÃï`âÊëŒè€ÉäÅ[ÉWÉáÉìÇèúäOǵÇΩóÃàÊÅAÇ‹ÇΩÇÕǪÇÍÇ…ãflǢLJÇÃÇ…Ç»ÇÈÇΔçlǶÇÁÇÍÇÈÇ©ÇÁÇ≈Ç∑ÅBAGL ÇÃÉäÅ[ÉWÉáÉìÇÃÉRÉsÅ[ÇÅAQuickDraw ÇÃÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇèúäOǵÇΩóÃàÊÇΔìØÇ∂Ç…ï€Çøë±ÇØÇÈÇÃÇÕÅAǫǧå©ÇƒÇ‡ç¢ìÔÇ≈Ç∑ÅBOpenGL Ç™ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃâÓç›Ç»ÇµÇ…îÒìØä˙Ç…çXêVÇ≥ÇÍÇÈâ¬î\ê´Ç‡Ç†ÇÈÇÃÇ≈ÅAǻǮÇ≥ÇÁÇ≈Ç∑ÅBDZÇà AGL API ÇÕÅAÉNÉâÉCÉAÉìÉgÉAÉvÉäÉPÅ[ÉVÉáÉìópÇ…ê›åvÇ≥ÇÍǃǮÇËÅAvisRgn Ç‚ clipRgn ÇΔǢǡÇΩä˘ë∂ÇÃÉEÉCÉìÉhÉEÉäÅ[ÉWÉáÉìÇ…ëŒÇ∑ÇÈì¡íËÇÃä÷åWÇàÍêÿéùÇΩǻǢÉäÅ[ÉWÉáÉìÇíºê⁄íÒãüǵNjÇ∑ÅB

è„èqÇÃÇÊǧDžÅAAGL Ç≈ÇÕÅAAGL_CLIP_REGION ÇéwíËǵÇΩ aglSetInteger ÇÃåƒÇ—èoǵÇÃéûì_Ç≈ÅAÉäÅ[ÉWÉáÉìÇÃÉRÉsÅ[Ç™çÏê¨Ç≥ÇÍÇ‹Ç∑ÅBǪÇÃÇΩÇflÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAaglSetinteger Ç©ÇÁèàóùÇ™ï‘ǡǃǴÇΩdžÇΔÇÕÅAǢǬÇ≈LJÉäÅ[ÉWÉáÉìÇîjä¸Ç≈Ç´Ç‹Ç∑ÅBÉäÅ[ÉWÉáÉìÇÃÉRÉsÅ[ëÄçÏÇÕÅAÉäÅ[ÉWÉáÉìÇ™ï°éGÇæÇΔîÒèÌÇ…ïâíSÇ™ëÂÇ´Ç≠Ç»ÇÈDZÇΔǙdžÇÈÇÃÇ≈ÅAÉpÉtÉHÅ[É}ÉìÉXÇ™èdéãÇ≥ÇÍÇÈÉRÅ[ÉhÇ≈ÇÕÅAAGL_CLIP_REGION ÇéwíËǵÇΩ aglSetinteger ÇÃégópÇÕå¿íËÇ∑ÇÈÇ◊Ç´Ç≈Ç∑ÅB

ÉoÉbÉtÉ@ãÈå`ÇóLå¯Ç…Ç∑ÇÈÇÃÇΔìØÇ∂ÇÊǧDžÅAÉNÉäÉbÉvÉäÅ[ÉWÉáÉìLJóLå¯Ç…Ç∑ÇÈïKóvǙdžÇÈDZÇΔÇñYÇÍǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅBó·ÇÉäÉXÉg 3 Ç…é¶ÇµÇ‹Ç∑ÅB


#include <AGL/agl.h>

// aglContext ÇÕÅAä˘ë∂ÇÃóLå¯Ç»ÉRÉìÉeÉLÉXÉg
aglEnable (aglContext, AGL_CLIP_REGION);

ÉäÉXÉg 3. ÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇÃóLå¯âª


ÉäÉXÉg 3 ÇÃÉRÅ[ÉhÇÕÅAÉäÉXÉg 2 íÜÇà SetClipRegion ÉRÅ[ÉhÇ…ä‹ÇflÇÈDZÇΔLJÇ≈Ç´Ç‹Ç∑ÅBDZÇÃó·Ç≈ÇÕÉRÅ[ÉhÇï ÅXDžǵNjǵÇΩÇ™ÅAǪÇÍÇÕÅAÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇ™óLå¯Ç…Ç»ÇÈÇΩÇ—Ç…ÉäÅ[ÉWÉáÉìé©ëÃÇÉäÉZÉbÉgÇ∑ÇÈïKóvǙǻǢǩÇÁÇ≈Ç∑ÅBç≈å„DžLJǧàÍì_ÅAÉäÅ[ÉWÉáÉìÇÉEÉCÉìÉhÉEÉTÉCÉYÇ…ëŒâûÇ∑ÇÈÇÊǧDžǵǃçÏê¨ÇµÇΩèÍçáÅAÉTÉCÉYïœçXÇ…ëŒÇ∑ÇÈçXêVÇÃóvåèÇÕÉoÉbÉtÉ@ãÈå`ÇÃèÍçáÇΔìØólÇ≈Ç∑ÅB

ÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇΔÉoÉbÉtÉ@ãÈå`ÇÕÇ«ÇøÇÁLJÅAÉEÉCÉìÉhÉEÇ…Ç®ÇØÇÈÉAÉNÉZÉâÉåÅ[ÉgÇ≥ÇÍÇΩÉTÅ[ÉtÉFÉXï`âÊÇÃÉTÉCÉYÇΔå`èÛÇå¿íËÇ∑ÇÈ 2 í ÇËÇÃï÷óòÇ»ï˚ñ@ÇÅAAGL ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…íÒãüǵNjÇ∑ÅBDZÇÍÇóòópǵǃÅAAGL ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAÉAÉNÉZÉâÉåÅ[ÉgÇ≥ÇÍÇΩÉTÅ[ÉtÉFÉXÇÃëŒè€Ç…ǻǡǃǢǻǢîÕàÕÇ… 2D ÉRÉìÉeÉìÉcÇï`âÊÇ≈Ç´Ç‹Ç∑ÅBÉoÉbÉtÉ@ãÈå`ÇÕ Mac OS X ÇÃëSǃÇÃÉoÅ[ÉWÉáÉìÇ≈égópÇ≈Ç´Ç‹Ç∑Ç™ÅAÉNÉäÉbÉvÉäÅ[ÉWÉáÉìÇÕ Mac OS X v10.2 à»ç~DžǮǢǃÇÃÇ›égópâ¬î\Ç≈Ç∑ÅB


[2002 îN 12 åé 3 ì˙]